 /* File utilidades.h */
 #ifndef UTILIDADES_H
 #define UTILIDADES_H



class Tabla_de_contingencia
{
public:
   int id; 
   int vp; 
   int vn; 
   int fp; 
   int fn; 
   int otro;
   int total;

Tabla_de_contingencia(int idd)
{   
   id=idd;
   vp=0;
   vn=0;
   fp=0;
   fn=0;
   otro=0;
}   

Tabla_de_contingencia(){
   vp=0;
   vn=0;
   fp=0;
   fn=0;
   total=0;
}   
};

void resume(map<int,int> verdaderos,map<int,int> obtenidos){


ifstream parametros2("parametros.dat");
ofstream log_resumen("resumen.log",ios::out);


map< int, Tabla_de_contingencia> tabla;

int vp=0;
int vn=0;
int fp=0;
int fn=0;
int otro=0;
int tam=verdaderos.size();
string linea;

tdc << "PARAMETROS" << endl;

while(!parametros2.eof()){

     getline(parametros2,linea);
     tdc << linea << endl;

}

tdc << "TABLA DE CONTINGENCIA" << endl;

for(int i=0;i<tam;i++){

 log_resumen << i << ": ";
 if( obtenidos[i] >= 1 && verdaderos[i] >= 1){
   log_resumen << "Verdadero Positivo: " <<  obtenidos[i] << " & " << verdaderos[i] << endl;
   tabla[verdaderos[i]].vp++;
   vp++;

 }else if( obtenidos[i]==0 && verdaderos[i]==0){

   log_resumen << "Verdadero Negativo: " <<  obtenidos[i] << " & " << verdaderos[i] << endl;

   tabla[verdaderos[i]].vn++;
   vn++;

 }else if( obtenidos[i]>=1 && verdaderos[i]==0){

   log_resumen << "Falso Positivo: " <<  obtenidos[i] << " & " << verdaderos[i] << endl;

   tabla[verdaderos[i]].fp++;
   fp++;

 }else if( obtenidos[i]==0 && verdaderos[i]>=1){

   log_resumen << "Falso Negativo: " <<  obtenidos[i] << " & " << verdaderos[i] << endl;

   tabla[verdaderos[i]].fn++;
   fn++;

 }else{


   log_resumen << "Otro: " <<  obtenidos[i] << " & " << verdaderos[i] << endl;

   tabla[verdaderos[i]].otro++;
   otro++;



 }

   tabla[verdaderos[i]].total++;

}

double exactitud=(double)(vp+vn)/tam;
double error = (double)(fp+fn)/tam;
double sensibilidad = (double)vp/(vp+fn);
double especificidad = (double)vn/(fp+vn);
double vpp= (double)vp/(vp+fp);
double vpn= (double)vn/(vn+fn);


cout << "RESULTADO GENERAL" << endl << endl;
cout << "De un total de " << tam << endl << endl;
cout << vp << " Verdaderos Positivos." << endl;//Dio normal y era normal 
cout << fp << " Falsos Positivos." << endl;    //Dio anormal y era normal
cout << fn << " Falsos Negativos." << endl;    //Dio normal  y era anormal
cout << vn << " Verdaderos Negativos." << endl << endl;//Dio anormal y era anormal
cout << otro << " Otros." << endl << endl;
cout << "vp+fp = " << vp + fp << endl;

cout << "fn+vn = " << fn + vn << endl;

cout << "vp+fn = " << vp + fn << endl;
cout << "fp+vn = " << fp + vn << endl;


cout << "Exactitud = " << exactitud << endl;
cout << "Error = " << error << endl;
cout << "Sensibilidad = " << sensibilidad << endl;
cout << "Especificidad = " << especificidad << endl;
cout << "Valor predictivo: Positivo = " << vpp << endl;
cout << "Valor predictivo: Negativo = " << vpn << endl;



cout << endl;
cout << endl;


tdc << "RESULTADOS" << endl << endl;
tdc << "De un total de " << tam-1 << endl << endl;
tdc << vp << " Verdaderos Positivos." << endl;//Dio normal y era normal 
tdc << fp << " Falsos Positivos." << endl;    //Dio anormal y era normal
tdc << fn << " Falsos Negativos." << endl;    //Dio normal  y era anormal
tdc << vn << " Verdaderos Negativos." << endl << endl;//Dio anormal y era anormal
tdc << otro << " Otros." << endl << endl;
tdc << "vp+fp = " << vp + fp << endl;
tdc << "vp+fp = " << vp + fp << endl;
tdc << "fn+vn = " << fn + vn << endl;
tdc << "vp+fn = " << vp + fn << endl;
tdc << "fp+vn = " << fp + vn << endl;


tdc << "Exactitud = " << exactitud << endl;
tdc << "Error = " << error << endl;
tdc << "Sensibilidad = " << sensibilidad << endl;
tdc << "Especificidad = " << especificidad << endl;
tdc << "Valor predictivo: Positivo = " << vpp << endl;
tdc << "Valor predictivo: Negativo = " << vpn << endl;



tdc << endl;
tdc << endl;

ofstream tdc_detalle("tdc_detalle.resultado",ios::out);
map < int, Tabla_de_contingencia >::iterator iter;

tdc_detalle << "id,vp,fp,fn,vn" << endl;

 for(iter=tabla.begin();iter!=tabla.end();iter++){

    tdc_detalle << iter->first << "," << iter->second.vp << "," << iter->second.fp << "," << iter->second.fn << "," << iter->second.vn << endl;


 }


}

#endif /* UTILIDADES_H */


